package com.gep.session.impl.manager;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.apache.log4j.Logger;

import com.gep.dto.EquipamentoDTO;
import com.gep.dto.ItemSolicitacaoDTO;
import com.gep.dto.PecaDTO;
import com.gep.dto.SolicitacaoDTO;
import com.gep.entity.Equipamento;
import com.gep.session.manager.GerencialBORemota;
import com.gep.util.Conversor;

@Stateless(mappedName = "ejb/gep/GerencialBORemota")
public class GerencialBO implements GerencialBORemota {

	private static final Logger LOGGER = Logger
			.getLogger(GerencialBORemota.class);

	@PersistenceContext
	private EntityManager em;

	public Object[] ocorrenciasFrequentes() {
		// TODO Auto-generated method stub
		return null;
	}

	@SuppressWarnings("unchecked")
	public List<Object[]> acompanharSaidaDePecas(Date inicio, Date fim,
			EquipamentoDTO equipamentoDTO) {
		List<Object[]> lista = null;
		if (equipamentoDTO != null) {
			Equipamento equipamento = em.find(Equipamento.class, equipamentoDTO
					.getCodEquipamento());
			Query query = em
					.createQuery("SELECT p ,sum(its.quantidade) "
							+ "FROM ItemSolicitacao its, Peca p, Equipamento e "
							+ "WHERE  its.peca = p and e = p.equipamento and e = :pEquipamento "
							+ "and its.solicitacao.dataSolicitacao between :pInicio "
							+ "and :pFinal " + "GROUP BY p.nomePeca "
							+ "ORDER BY sum(its.quantidade) DESC");
			query.setParameter("pInicio", inicio);
			query.setParameter("pFinal", fim);
			query.setParameter("pEquipamento", equipamento);
			query.setMaxResults(5);
			lista = (List) query.getResultList();

			for (Object[] object : lista) {

				PecaDTO pecaDTO = (PecaDTO) Conversor.converter(object[0],
						PecaDTO.class.getName());
				object[0] = (Object) pecaDTO;

			}

		} else {
			Query query = em
					.createQuery("SELECT p ,sum(its.quantidade) "
							+ "FROM ItemSolicitacao its, Peca p "
							+ "WHERE  its.peca = p "
							+ "and its.solicitacao.dataSolicitacao between :pInicio and :pFinal "
							+ "GROUP BY p.nomePeca "
							+ "ORDER BY sum(its.quantidade) DESC");
			query.setParameter("pInicio", inicio);
			query.setParameter("pFinal", fim);
			query.setMaxResults(5);
			lista = (List) query.getResultList();

			for (Object[] object : lista) {

				PecaDTO pecaDTO = (PecaDTO) Conversor.converter(object[0],
						PecaDTO.class.getName());
				object[0] = (Object) pecaDTO;

			}
		}
		return lista;
	}

	public List<Object[]> acompanharTempoReparo(Date inicio, Date fim,
			EquipamentoDTO equipamentoDTO) {
		List<Object[]> lista;
		Equipamento equipamento = em.find(Equipamento.class, equipamentoDTO
				.getCodEquipamento());
		Query query = em
				.createQuery("SELECT e ,p ,(sum(DATEDIFF(r.dataReparo,o.dataQuebra))/COUNT(*)) "
						+ "FROM Equipamento e,Peca p,ItemSolicitacao its, Ocorrencia o, Reparo r "
						+ "WHERE p.equipamento = e and its.peca = p "
						+ "and its.ocorrencia = o and o.reparo = r and e = :pEquipamento "
						+ "and its.solicitacao.dataSolicitacao between :pInicio and :pFinal "
						+ "GROUP BY p.codPeca ORDER BY p.nomePeca");
		query.setParameter("pInicio", inicio);
		query.setParameter("pFinal", fim);
		query.setParameter("pEquipamento", equipamento);
		query.setMaxResults(5);
		lista = (List) query.getResultList();
		for (Object[] object : lista) {

			EquipamentoDTO dto = (EquipamentoDTO) Conversor.converter(
					object[0], EquipamentoDTO.class.getName());
			object[0] = (Object) dto;
			PecaDTO pecaDTO = (PecaDTO) Conversor.converter(object[1],
					PecaDTO.class.getName());
			object[1] = (Object) pecaDTO;

		}

		return lista;

	}

	public List<Object[]> acompanharOcorrenciaFrequente(Date inicio, Date fim,
			EquipamentoDTO equipamentoDTO) {
		List<Object[]> lista;
		Equipamento equipamento = em.find(Equipamento.class, equipamentoDTO
				.getCodEquipamento());
		Query query = em
				.createQuery("SELECT m.nome,COUNT(*),e FROM Equipamento e, ItemSolicitacao its, "
						+ "Peca p, Ocorrencia o,Motivo m "
						+ "WHERE its.peca = p and e = p.equipamento "
						+ "and its.ocorrencia = o "
						+ "and o.motivo = m and e = :pEquipamento "
						+ "and its.solicitacao.dataSolicitacao between :pInicio and :pFinal "
						+ "GROUP BY m.nome ORDER BY COUNT(*) DESC");

		query.setParameter("pInicio", inicio);
		query.setParameter("pFinal", fim);
		query.setParameter("pEquipamento", equipamento);
		lista = (List) query.getResultList();
		for (Object[] object : lista) {

			EquipamentoDTO dto = (EquipamentoDTO) Conversor.converter(
					object[2], EquipamentoDTO.class.getName());
			object[2] = (Object) dto;

		}
		return lista;

	}
}
